维吉尼亚字符串加密解密小程序

首先说一下,这个程序的保密性不高= =!,就当练习玩。


最近刚刚学完双循环链表。就做了个这个

加密思路是,根据随机生成的密匙,对26字母进行移位;来选取密文。密匙大小为0~99;

程序比较简单,但是写完这个对我有很大的提高。

在调试过程中发现了许多自己的问题,比如说,加了循环没有加跳出去的条件。导致死循环,嗯,很多都是这个问题;

还有一个就是,在将密匙写入文件时,要将密匙以大写的字符形式的16进制保存。

然后我就想偷懒用fprintf来格式化直接写入文件16进制,随后就发现个问题;

就是当数值为0x0F时,他会将高位的0变成空白符,只写入F。

后来我就想把文件里的空格替换成字符'0',但是呢问题又来了,每当我fseek设置文件位置指针的时候,总是会指向文件头;

然后用了各种方法,包括手动来修改指针,无果。。。。

后来要朋友试一下,他那没问题...没问题...然后我就凌乱了。

 

= =所以出来了现在这样的程序,我不用偷懒的方法了。

 

话说,个人觉得 进制转换那个函数的思想是最好的。

**************************************************************************************************************

2013-10-01更新...

搞了一天,现在已经支持大小写英文,数字,和其他字符。 

关于小写的支持,是在大写字符处理的基础上增加了大小写转换(= =.这货就是想偷懒儿...)

刚开始写大小写转换的功能代码片段的时候,觉得重复性太强。就封装到函数里了,不过我怎么觉得封装之后比不封装更复杂?

 

在写数字支持的时候,发现自己的代码顺序摆放好不科学,属于一个功能区的东西都被分开了。

增加各种支持后,就不得不对于实现同功能的代码放到一起。

好吧,又有进步了。

 

下面贴文件,

顺序为:文档,函数头,身子。。

 

文档:

名称:Vigenere[维吉尼亚]
功能:用维吉尼亚方法对字符串进行加密/解密。
生成:程序运行后会根据加密解密选择,生成相应的文件。
	 文件内容:
	 if(加密)
	 {
		将密文和密匙顺序交替写入文件;
		例如:A(密文) + BF(密匙) = ABF
	 }
	 if(解密)
	 {
		保存明文到文件;
	 }

需要的函数:
	1. Slist Letter()												[字母字典]
	2. Slist Number()												[数字字典]
	2. char Matching(char plain, int key, Slist head, FLAG flag)	[密文/明文匹配]
	3. char upper_lower(FLAG *cflag, char letter)					[大小写转换]
	4. int convert(FLAG flag, char pword[2], int key)				[进制转换]
	5. void Plaintext()												[对输入的明文保存到文件]
	6. int Key(int seed)											[随机生成密匙]
	7. void Encryption(Slist Let_head, Slist Num_head)				[加密]
	8. void Decryption(Slist Let_head, Slist Num_head)				[解密]
	9. void UI()													[简易界面]

注:加密/解密方法
  1.将 密匙%26 取余;
  2.使用字典进行匹配;
  匹配方法:
  用取余后的密匙,循环查找字符。

  例如 密匙为2,明文为A, 那么密文就是C;
  解密的方法和这个相反,密文为C,明文就为A;
  密文的存储方法是 密文+密匙;
  所以在进行解密的时候,每次取三个字符,计算密匙对密文进行解密;
  
程序大致运行流程/思路:
	 1.进入选择界面
	 2.用户输入选择后,转入相应的功能
	 (Encryption加密)
	 {
		加密下有两个选项:
		(1,直接输入明文)
		{
			将输入的明文保存到 plaintext.txt 文件;
			直接转到下面
		}

		(2,从 plaintext.txt 的文件中获取明文)
		{
			while(非 文件尾){
				生成随机密匙;
				对密匙进行计算,获取文件中的明文进行加密
				将密文保存到文件中;
				将密匙转换成字符的16进制形式
				将字符的16进制的密匙保存到密文后
			}
			删除 plaintext.txt 明文文件
		}
	 }
	 (Decryption解密)
	 {
		解密只能从此程序生成的文件中获取密文
		{
			分别获取密文和密匙;
			对字符型密匙转换成数据型10进制密匙
			计算密匙,对密文进行解密
			将明文保存到文件
		}
	 }



 函数头:

#if 0 
名称:vigenere.h
内容:程序所用到的定义以及函数;

1. Slist Letter()												[字母字典]
2. Slist Number()												[数字字典]
2. char Matchin
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值